import os
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime

# ---------------------------
# 1. 解决中文乱码问题
# ---------------------------
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 使用微软雅黑显示中文
plt.rcParams['axes.unicode_minus'] = False              # 解决负号显示问题
sns.set_theme(style="whitegrid", font='Microsoft YaHei')

# ---------------------------
# 2. 固定爬虫日期及构建 Excel 文件路径
# ---------------------------
clawer_date = "2025-05-20"  # 固定爬虫日期

# 构建两个 Excel 文件路径
file_path_xd = os.path.join("F:\\network-collect\\putout", clawer_date, "西安-大连.xlsx")
file_path_dx = os.path.join("F:\\network-collect\\putout", clawer_date, "大连-西安.xlsx")

# 检查文件是否存在
for fp in [file_path_xd, file_path_dx]:
    if not os.path.exists(fp):
        print("无法找到 Excel 文件：", fp)
        exit()

# ---------------------------
# 3. 读取 Excel 数据
# ---------------------------
df_xd = pd.read_excel(file_path_xd, engine='openpyxl')
df_dx = pd.read_excel(file_path_dx, engine='openpyxl')

# 如果票价列为字符串，转换为数值（剔除非数字字符）
if df_xd['票价'].dtype == object:
    df_xd['票价'] = pd.to_numeric(df_xd['票价'], errors='coerce')
if df_dx['票价'].dtype == object:
    df_dx['票价'] = pd.to_numeric(df_dx['票价'], errors='coerce')

# 将 '出发时间'（格式 "HH:MM:SS"）转换为小时，生成新列 '出发时间_时'
df_xd['出发时间_时'] = pd.to_datetime(df_xd['出发时间'], format="%H:%M:%S", errors='coerce').dt.hour
df_dx['出发时间_时'] = pd.to_datetime(df_dx['出发时间'], format="%H:%M:%S", errors='coerce').dt.hour

# =============================================================================
# 【方法二】 使用折线图和点图展示各小时平均票价趋势
# =============================================================================

# 首先按 '出发时间_时' 聚合数据，计算每个小时的平均票价
avg_price_xd = df_xd.groupby("出发时间_时")["票价"].mean().reset_index()
avg_price_dx = df_dx.groupby("出发时间_时")["票价"].mean().reset_index()

## 2.1 折线图（Line Plot）
fig, axes = plt.subplots(1, 2, figsize=(16, 6))

sns.lineplot(ax=axes[0], data=avg_price_xd, x="出发时间_时", y="票价", marker="o")
axes[0].set_title("西安-大连 各小时平均票价 (折线图)")
axes[0].set_xlabel("出发时间（小时）")
axes[0].set_ylabel("平均票价")

sns.lineplot(ax=axes[1], data=avg_price_dx, x="出发时间_时", y="票价", marker="o")
axes[1].set_title("大连-西安 各小时平均票价 (折线图)")
axes[1].set_xlabel("出发时间（小时）")
axes[1].set_ylabel("平均票价")

plt.tight_layout()
plt.show()
